#pragma once

#include <cstdio>
#include <iostream>
#include <signal.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

// 守护进程
void daemonize()
{
    int fd = 0;
    // 首先忽略 SIGPIPE
    // 如果向一个已经关闭的文件中写入数据, 就会有 SIGPIPE 信号, 可能导致服务器关闭, 所以这里需要设置为忽略
    signal(SIGPIPE, SIG_IGN);
    // 更改工作目录
    // chdir()
    // 让自己不成为组长
    if (fork() > 0)
        exit(0);

    // 设置自己是一个独立的会话
    setsid();
    // 对打印的信息进行重定向
    if ((fd = open("/dev/null", O_RDWR) != -1))
    {
        // 重定向0 1 2
        dup2(fd, STDIN_FILENO);
        dup2(fd, STDOUT_FILENO);
        dup2(fd, STDERR_FILENO);
        // 关闭不需要的 fd
        if (fd > STDERR_FILENO)
            close(fd);
    }
}